/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Negocio;


import Ordenamiento.OrdenIngresos;
import java.security.NoSuchAlgorithmException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 *
 * @author Diego
 */
public class Cliente {

    private Integer idCliente;
    private String razonSocial;
    private String cuit;
    private String direccion;
    private String telefono;
    private String password;
    private String email;
    private boolean activo;

    private Set<LoteTercero> lotes; //Agregar al modelo 
    private Set<YerbaMateVerde> yerbaVerde;
    private Set<Ingreso> ingresos;
    private Set<Salida> salidas;
    //Falta Pedidos o algo asi

    public Cliente() {
    }

    public Cliente(String razonSocial, String cuit, String direccion, String telefono, String password, String email) {
        this.razonSocial = razonSocial;
        this.cuit = cuit;
        this.direccion = direccion;
        this.telefono = telefono;
        this.password = password;
        this.email = email;
        this.activo = true;
        this.lotes = new HashSet();
        this.yerbaVerde = new HashSet();
        this.ingresos = new HashSet();
        this.salidas = new HashSet();

        Empresa.persistencia.insert(this);
    }

    public Integer getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(Integer idCliente) {
        this.idCliente = idCliente;
    }

    public String getRazonSocial() {
        return razonSocial;
    }

    public void setRazonSocial(String razonSocial) {
        this.razonSocial = razonSocial;
    }

    public String getCuit() {
        return cuit;
    }

    public void setCuit(String cuit) {
        this.cuit = cuit;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Set<Ingreso> getIngresos() {
        return ingresos;
    }

    public void setIngresos(Set<Ingreso> ingresos) {
        this.ingresos = ingresos;
    }

    public Set<Salida> getSalidas() {
        return salidas;
    }

    public void setSalidas(Set<Salida> salidas) {
        this.salidas = salidas;
    }

    public boolean isActivo() {
        return activo;
    }

    public void setActivo(boolean activo) {
        this.activo = activo;
    }

    public Set<LoteTercero> getLotes() {
        return lotes;
    }

    public void setLotes(Set<LoteTercero> lotes) {
        this.lotes = lotes;
    }

    public Set<YerbaMateVerde> getYerbaVerde() {
        return yerbaVerde;
    }

    public void setYerbaVerde(Set<YerbaMateVerde> yerbaVerde) {
        this.yerbaVerde = yerbaVerde;
    }

    //Ver Exception    
    public boolean validarUsuario(String userName, String pass) {
        boolean salida = false;
        if (this.getCuit().equalsIgnoreCase(userName) && this.getPassword().equalsIgnoreCase(pass)) {
            salida = true;
        }

        return salida;
    }

    public void agregarIngreso(Ingreso ingreso) {
        this.ingresos.add(ingreso);
        Empresa.persistencia.update(this);
    }

    public void agregarYerba(YerbaMateVerde ymv) {
        this.yerbaVerde.add(ymv);
        Empresa.persistencia.update(this);
    }

    public void agregarLote(LoteTercero lote) {
        this.lotes.add(lote);
        Empresa.persistencia.update(this);
    }

    public void agregarSalida(Salida unaSalida) {
        this.salidas.add(unaSalida);
        Empresa.persistencia.update(this);
    }

    public String toString() {
        return this.getRazonSocial() + " " + this.getCuit();
    }

    public void darDeBaja() {
        //Falta Controlar
        this.activo = false;
        Empresa.persistencia.update(this);
    }

    public void actualizarDatos(String razonSocial, String cuit, String direccion, String telefono, String email) {
        //Solo datos no pass ni username
        this.razonSocial = razonSocial;
        this.cuit = cuit;
        this.direccion = direccion;
        this.telefono = telefono;
        this.email = email;
        Empresa.persistencia.update(this);
    }

    public void actualizarPass(String unPass) {
        this.password = unPass;
        Empresa.persistencia.update(this);
    }

    public boolean cambioPassword(String unPassword) throws NoSuchAlgorithmException {
        return !this.getPassword().equals(unPassword);
    }
    
    public List<Ingreso> obtenerIngresos(int mes){ //solo el año corriente
        List<Ingreso> salida = new ArrayList();
        Iterator it = this.ingresos.iterator();
        Ingreso unIngreso;
        int anio = Calendar.getInstance().get(Calendar.YEAR);
        while(it.hasNext()){
            unIngreso = (Ingreso) it.next();            
            if(unIngreso.anio()== anio && unIngreso.mes() == mes){
                salida.add(unIngreso);                
            }
        }
        this.ordenarRegistroHorario(salida);
        return salida;
        
    }
    
    public List<Ingreso> obtenerIngresos(String desde, String hasta) throws Exception{
        
        Date pDesde = Empresa.miUtilidadDeFechas.fechaDb(desde);
        Date pHasta = Empresa.miUtilidadDeFechas.fechaDb(hasta);
                
        List<Ingreso> salida = new ArrayList();

        Calendar fDesde = new GregorianCalendar();
        fDesde.setTime(pDesde);
        Calendar fHasta = new GregorianCalendar();
        fHasta.setTime(pHasta);
        Iterator it = this.ingresos.iterator();
        Calendar fecha = new GregorianCalendar();       
        Ingreso unIngreso;        
        while(it.hasNext()){
            unIngreso = (Ingreso) it.next();            
            fecha.setTime(unIngreso.getFecha());
            if(fecha.before(fHasta) && fecha.after(fDesde)){
                salida.add(unIngreso);                
            }
        }                      
        this.ordenarRegistroHorario(salida);
        return salida;
        

    }
    
    public List<Ingreso> ordenarRegistroHorario(List<Ingreso> lista) {
        List<Ingreso> aux = new LinkedList();
        Collections.sort(lista, new OrdenIngresos());            
        return aux;
    }
    
    

    
    public void cambiarPass(String oldPass,String newPass) throws NoSuchAlgorithmException{
        oldPass= Empresa.miClaseEncriptadora.encriptar(oldPass);
        newPass= Empresa.miClaseEncriptadora.encriptar(newPass);
        if(!this.cambioPassword(oldPass)){
            this.actualizarPass(newPass);
        }
    }
}
